# -*- coding: utf-8 -*-
"""
    :author: MQ Liu(260137)
    :email: 260137@gree.com.cn
    :decription: gunicorn 应用容器配置文件
    :createtime: 2019/01/11
"""
import sys
import os
import multiprocessing
import logging.handlers
from logging.handlers import RotatingFileHandler
# 用于gevent模式下IO操作时，协程的自动切换，gevent只能在Unix/Linux下运行，Windows下不保证正常安装和运行
from gevent import monkey
monkey.patch_all()

path_of_current_file = os.path.abspath(__file__)
path_of_current_dir = os.path.split(path_of_current_file)[0]

# _file_name = os.path.basename(__file__)
_file_name = "gunicorn"
sys.path.insert(0, path_of_current_dir)
# 使用的工作模式，默认为sync
# worker_class = 'sync'
worker_class = 'gevent'  # 最好使用'gevent'方式
# 用于处理工作进程的数量(正整数)
worker = 2
# workers = multiprocessing.cpu_count() * 2 + 1
# 最大客户端并发数量，只适用于eventlet、gevent工作方式，默认为1000
worker_connections = 1000
# 重新启动之前，worker将处理的最大请求数，设置合理值有助于防止内存溢出(默认为0,不重启)
max_requests = 2000
# 抖动参数，防止worker全部同时重启，每次同时重启的worker最大值
max_requests_jitter = 4
# 超过该秒数时间后，工作将被kill掉，并重新启动，一般设为30秒
timeout = 600
# 优雅的人工超时时间，默认为30，worker必须在此graceful_timeout时间范围内处理完当前请求，在超时(在接收到重启信号后开始)之后仍然活着的工作将被强行杀死
graceful_timeout = 60
# 在Keep-Alive connection状态，请求等待时间，默认为2秒，
keepalive = 5

# ## server 机制
pidfile = '%s/logs/%s.pid' % (path_of_current_dir, _file_name)
# 应用是否以daemon方式运行
daemon = False
# 指定worker进程运行的用户名和用户组
# user = root
# group = root

# ## 日志配置
loglevel = 'info'
access_log_format = '%(p)s %(h)s %(l)s%(l)s %(t)s "%(r)s" %(s)s %(L)s %(b)s %(f)s " "%(a)s"'
# 默认的logger handler为FileHandler,将该handler的输出全部重定向到系统/dev/null,弃用，不保存
errorlog = "/dev/null"
accesslog = "/dev/null"
# # 错误日志
# errorlog = '%s/logs/%s_error.log' % (path_of_current_dir, _file_name)
# # 访问日志(前端访问后端的请求)
# accesslog = '%s/logs/%s_access.log' % (path_of_current_dir, _file_name)

# 自定义添加RotatingFileHandler，按照大小自动分割日志文件，一旦达到指定的大小重新生成文件
# access handler
# 获取gunicorn中的access logger对象
acc_logger = logging.getLogger('gunicorn.access')
file_access_log_handler = RotatingFileHandler('%s/logs/%s_access.log' % (path_of_current_dir, _file_name),
                                              maxBytes=1024*1024*100,
                                              backupCount=10,
                                              encoding='UTF-8')
acc_logger.addHandler(file_access_log_handler)

# error handler
# 获取gunicorn中的error logger对象
err_logger = logging.getLogger('gunicorn.error')
file_error_log_handler = RotatingFileHandler('%s/logs/%s_error.log' % (path_of_current_dir, _file_name),
                                             maxBytes=1024*1024*100,
                                             backupCount=10,
                                             encoding='UTF-8')
# 设置error log 记录格式:时间、处理进程、日志等级、日志信息
formatter = logging.Formatter('%(asctime)s [%(process)d] [%(levelname)s] %(message)s')
file_error_log_handler.setFormatter(formatter)
err_logger.addHandler(file_error_log_handler)

# ## 调试 ###
# 当源代码改变时自动重启workers(用于开发阶段)
reload = True
# 在工作进程被复制(派生)之前加载应用程序代码，默认为Fasle,使得APScheduler任务scheduler只被worker执行一次。
preload_app = True

debug = False

# 其它一些配置项
bind = "%s:%s" % ("127.0.0.1", 8899)
# 服务器中在pending状态的最大连接数，即client处于waiting的数目，超过这个数目，client连接会得到一个error
backlog = 2048

# 在ps ，top等命令查看显示的进程名称
# proc_name = your web app name
# 默认进程名称为 gunicorn
# default_proc_name = gunicorn

# raw_env = 自定义环境变量

# 控制台输出print消息
# capture_output = False
